正樣本中要被偵測的物件要被框選出來,這個過稱我們稱為標記,標記的正確性對Haar特徵分類器模型影響極大,因此我們需要顯示出正樣本框選的區域。
顯示框選區域
清空指定資料夾的內容
def emptydir(dirname):
if os.path.isdir(dirname):
shutil.rmtree(dirname)
sleep(2) #需延遲,否則會出錯
os.mkdir(dirname)
在圖片上繪製紅色的圖框,最後將繪製圖框後的圖片保存到picMark的目標資料夾中
from PIL import Image, ImageDraw
import shutil, os
from time import sleep
fp = open('Haar-Training_carPlate/training/positive/info.txt', 'r')
line = fp.readline() #讀取一列文字
emptydir('picMark')
print('開始繪製圖框!')
while line:
data = line.split(' ')
img = Image.open('Haar-Training_carPlate/training/positive/' + data[0]) #讀取檔案
draw = ImageDraw.Draw(img) #繪圖
n = data[1] #圖框數量
#繪製圖框
for i in range(int(n)):
x = int(data[2+i*4])
y = int(data[3+i*4])
w = int(data[4+i*4])
h = int(data[5+i*4])
draw.rectangle((x, y, x+w, y+h), outline='red')
filename = (data[0].split('/'))[-1] #圖片檔的路徑中提取出檔名
img.save('picMark/' + filename) #存檔
line = fp.readline() #讀下一列文字
fp.close() #關閉 'info.txt' 文字檔
print('繪製圖框結束!')
調整框選區域的長寬
fp = open('Haar-Training_carPlate/training/positive/info.txt', 'r')
line = fp.readline()
rettext = ''
print('開始轉換圖框!')
while line:
data = line.split(' ')
n = data[1]
rettext += data[0] + ' ' + n + ' '
#讀取原來資料
for i in range(int(n)):
x = float(data[2+i*4])
y = float(data[3+i*4])
w = float(data[4+i*4])
h = float(data[5+i*4])
if (w/h) < 3.8: #如果寬長比小於3.8
newW = h * 3.8 #寬=高*3.8
x -= int((newW - w) / 2) #計算新X位置
if x<=0:
w = int(newW)
rettext = rettext+str(int(x))+' '+data[3+i*4]+' '+str(int(w))+' '+data[5+i*4]
line = fp.readline()
fp.close()
fp = open('Haar-Training_carPlate/training/positive/info.txt', 'w')
fp.write(rettext)
fp.close()
print('轉換圖框結束!')
---20231013---